/**
 * 
 * @author ZhangHuihua@msn.com
 * @param {Object}
 *            opts Several options
 */
(function($) {
	$.fn.extend({
		pagination : function(opts) {
			var setting = {
				first$ : "li.j-first",
				prev$ : "li.j-prev",
				next$ : "li.j-next",
				last$ : "li.j-last",
				nums$ : "li.j-num>a",
				jumpto$ : "li.jumpto",
				pageNumFrag : '<li class="#liClass#"><a href="javascript:;">#pageNum#</a></li>'
			};
			return this.each(function() {
				var $this = $(this);
				/*------------------------------------------------------------*/
				var targetType = $this.attr("targetType");
				var $parent = targetType == "dialog" ? $.pdialog.getCurrent() : navTab.getCurrentPanel();
				/*------------------------------------------------------------*/
				var pc = new Pagination(opts);
				var interval = pc.getInterval();
				var pageNumFrag = '';
				for (var i = interval.start; i < interval.end; i++) {
					pageNumFrag += setting.pageNumFrag.replaceAll("#pageNum#",
							i).replaceAll("#liClass#",i == pc.getCurrentPage()? 'selected j-num': 'j-num');
				}
				$this.html(DWZ.frag["pagination"].replaceAll("#pageNumFrag#",
						pageNumFrag).replaceAll("#currentPage#",
						pc.getCurrentPage())).find("li").hoverClass();
				var $first = $this.find(setting.first$);
				var $prev = $this.find(setting.prev$);
				var $next = $this.find(setting.next$);
				var $last = $this.find(setting.last$);

				if (pc.hasPrev()) {
					$first.add($prev).find(">span").hide();
					_bindEvent($prev, pc.getCurrentPage() - 1, pc.targetType(),
							pc.rel());
					_bindEvent($first, 1, pc.targetType(), pc.rel());
				} else {
					$first.add($prev).addClass("disabled").find(">a").hide();
				}

				if (pc.hasNext()) {
					$next.add($last).find(">span").hide();
					_bindEvent($next, pc.getCurrentPage() + 1, pc.targetType(),
							pc.rel());
					_bindEvent($last, pc.numPages(), pc.targetType(), pc.rel());
				} else {
					$next.add($last).addClass("disabled").find(">a").hide();
				}

				$this.find(setting.nums$).each(function(i) {
					_bindEvent($(this), i + interval.start, pc.targetType(), pc
									.rel());
				});
				$this.find(setting.jumpto$).each(function() {
					var $this = $(this);
					var $inputBox = $this.find(":text");
					var $button = $this.find(":button");
					$button.click(function(event) {
						var pageNum = $inputBox.val();
						if (pageNum && pageNum.isPositiveInteger()) {
							dwzPageBreak({
								targetType : pc.targetType(),
								rel : pc.rel(),
								data : {
									pageNum : pageNum
								}
							});
						}
					});
					$inputBox.keyup(function(event) {
						if (event.keyCode == DWZ.keyCode.ENTER)
							$button.click();
					});
				});
			});

			function _bindEvent($target, pageNum, targetType, rel) {
				$target.bind("click", {
							pageNum : pageNum
						}, function(event) {
							dwzPageBreak({
										targetType : targetType,
										rel : rel,
										data : {
											pageNum : event.data.pageNum
										}
									});
							event.preventDefault();
						});
			}
		},

		orderBy : function(options) {
			var op = $.extend({
						targetType : "navTab",
						rel : "",
						asc : "asc",
						desc : "desc"
					}, options);
			return this.each(function() {
						var $this = $(this).css({
									cursor : "pointer"
								}).click(function() {
							var orderField = $this.attr("orderField");
							var orderDirection = $this.hasClass(op.asc)
									? op.desc
									: op.asc;
							dwzPageBreak({
										targetType : op.targetType,
										rel : op.rel,
										data : {
											orderField : orderField,
											orderDirection : orderDirection
										}
									});
						});

					});
		},
		pagerForm : function(options) {
			var op = $.extend({
						pagerForm$ : "#pagerForm",
						parentBox : document
					}, options);
			var frag = '<input type="hidden" name="#name#" value="#value#" />';
			return this.each(function() {
				var $searchForm = $(this), $pagerForm = $(op.pagerForm$,
						op.parentBox);
				var actionUrl = $pagerForm.attr("action").replaceAll("#rel#",
						$searchForm.attr("action"));
				$pagerForm.attr("action", actionUrl);
				$searchForm.find(":input").each(function() {
					var $input = $(this), name = $input.attr("name");
					if (name
							&& (!$input.is(":checkbox,:radio") || $input
									.is(":checked"))) {
						if ($pagerForm.find(":input[name='" + name + "']").length == 0) {
							var inputFrag = frag.replaceAll("#name#", name)
									.replaceAll("#value#", $input.val());
							$pagerForm.append(inputFrag);
						}
					}
				});
			});
		}
	});

	var Pagination = function(opts) {
		this.opts = $.extend({
					targetType : "navTab", // navTab, dialog
					rel : "", // 用于局部刷新div id号
					totalCount : 0,//总条数
					numPerPage : 10,//每页条数
					pageNumShown : 10,//
					currentPage : 1,//当前页
					callback : function() {
						return false;
					}
				}, opts);
	}

	$.extend(Pagination.prototype, {
		        //类型  navTab dialog
				targetType : function() {
					return this.opts.targetType
				},
				rel : function() {
					return this.opts.rel
				},
				//获取总页数
				numPages : function() {
					return Math.ceil(this.opts.totalCount/ this.opts.numPerPage);
				},
				getInterval : function() {
					var ne_half = Math.ceil(this.opts.pageNumShown / 2);
					var np = this.numPages();
					var upper_limit = np - this.opts.pageNumShown;
					var start = this.getCurrentPage() > ne_half ? Math.max(Math
									.min(this.getCurrentPage() - ne_half,
											upper_limit), 0) : 0;
					var end = this.getCurrentPage() > ne_half ? Math.min(this
									.getCurrentPage()
									+ ne_half, np) : Math.min(
							this.opts.pageNumShown, np);
					return {
						start : start + 1,
						end : end + 1
					};
				},
				//获取当前页
				getCurrentPage : function() {
					var currentPage = parseInt(this.opts.currentPage);
					if (isNaN(currentPage))
						return 1;
					return currentPage;
				},
				//获取前一页
				hasPrev : function() {
					return this.getCurrentPage() > 1;
				},
				//获取后一页
				hasNext : function() {
					return this.getCurrentPage() < this.numPages();
				}
			});
})(jQuery);
